package cn.edu.scau.cmi.front.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import org.apache.poi.ss.usermodel.Row;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.edu.scau.cmi.ema.controller.base.CmiEmaController;
import cn.edu.scau.cmi.ema.domain.Address;
import cn.edu.scau.cmi.ema.domain.Adultertype;
import cn.edu.scau.cmi.ema.domain.Event;
import cn.edu.scau.cmi.ema.domain.Site;
import cn.edu.scau.cmi.front.domain.FuzzyAddress;

@Service("FuzzyAddressService")
@Transactional(timeout=300000000)
public class FuzzyAddressServiceImpl extends CmiEmaController implements FuzzyAddressService {

	/*
	 * 通过分词了的地址字符串查找到包含有 阿斯顿
	 * addressString：利用/隔开的可能的地址字符串：湖北/仙桃/仙桃中学
	 * 返回排序了的可能地址列表供选择
	 * 
	 */
	
	@Override
	public List<Address> fuzzyAddresses(Set<String> addressString) {
		List<Address> addressList = new ArrayList<Address>();
		
//		String[] splitAddresses =  addressString.split("\\/");
//		去掉明显不合理的地址，例如去除字数少于2个的，纯数字的等等数据
		List<String> validSplitAddressStringlist = new ArrayList<String>();
		
		
		for(String li:addressString) {
			if((li.matches("[0-9]+" ) || li.length() <2)) {
				continue;
			}
			validSplitAddressStringlist.add(li);
		}
		
//		删除不需要的数据splitAddresses.
//		每一个分词后的地址
		for(String validSplitAddressString : validSplitAddressStringlist) {
			if(validSplitAddressString.length() >=2) {
//				int maxMatchAlaphet = 0;
				Set<Address> addresses = addressDAO.findAddressByNameContaining(validSplitAddressString);
//				数据库中查找到的地址：
				for(Address address: addresses) {
//					System.out.println("利用关键字查找到的地址的全称是：" + address.getDescription());
//					查找到地址的最大匹配数量
//					maxMatchAlaphet = maxMatchAlaphet(splitAddresses, add.getDescription());
//					System.out.println("，    这个地址包含的原地址的关键词的数量是：" + maxMatchAlaphet);
					addressList.add(address);
				}
			}
			
		}
//		将模糊匹配的地址数据根据地址描述中包含的数量排序 
		addressList = sortAddressByMaxMatch(addressList, validSplitAddressStringlist);
		return addressList;
	}
	
	/*
	 * addressList：所有的需要排序的地址
	 * 	 	亚洲中国湖北仙桃长兴街道 福建省, 南平, 武夷山市, 度假区, 曼陀岩, 中国, 旅游, 商贸城
	 * 		亚洲中国广东广州长兴街道
	 * validSplitAddresslist：有效的分词了的地址名称列表，例如    ["广东", "长兴"]
	 * 以上2个地址分别得到的结果是1，2.
	 * 排序的结果是后面的一个在前面
	 * 
	 */
	private List<Address> sortAddressByMaxMatch(List<Address> addressList, List<String> validSplitAddresslist) {
		
		List<FuzzyAddress> fuzzyAddressList = new ArrayList<FuzzyAddress>();
		List<Address> sortedAddressList = new ArrayList<Address>();
//		将Address封装成FuzzyAddress，对FuzzyAddress根据最多出现次数排序，然后将排序了的地址列表在返回给Address列表
		for(Address address : addressList) {
			FuzzyAddress fuzzyAddress = new FuzzyAddress();
			fuzzyAddress.setAddress(address);
			
			int matchQuantity = maxMatchAlaphet(validSplitAddresslist, address.getDescription());
			fuzzyAddress.setMatchQuantity(matchQuantity);
			
	//		地址出现的次数
			
			fuzzyAddressList.add(fuzzyAddress);
		}
//		fuzzyAddress排序
		Collections.sort(fuzzyAddressList);
//		排序后的地址返回大Address列表，按照道理，应该是按照顺序的，也有可能不是，没有测试！！！！！！
		for(FuzzyAddress fuzzyAddress : fuzzyAddressList) {
			Address address = fuzzyAddress.getAddress();
//			System.out.println("------依次添加的地址包含的数量是" + fuzzyAddress.getMatchQuantity());
			sortedAddressList.add(address);
		}
		
		return sortedAddressList;
		}


	// 字符串数组在一个描述中出现的次数，"河南", "商贸", "在"亚洲中国河南省省直辖县级行政区划济源市济源市天坛街道办事处商贸城社区"中出现的次数是2
	private int maxMatchAlaphet(List<String> addressStrings, String description) {
		int maxMatchAlaphet = 0;
		for(int i =0; i<addressStrings.size(); i++) {
			int index = description.indexOf(addressStrings.get(i));//.indexOf(addressStrings.get(i));
			if(index >-1) {
				maxMatchAlaphet++;
			}
		}
		return maxMatchAlaphet;
	}
}